<?php
/**
 * 统一数据返回格式
 * @param int $code 状态码
 * @param string $msg 提示信息
 * @param mixed $data 返回数据
 * @return array
 */
function resData($code, $msg, $data) {
    return [
        'code' => $code,
        'msg' => $msg,
        'data' => $data,
    ];
}

/**
 * 成功返回数据
 * @param mixed $data 返回数据
 * @param string $msg 提示信息
 * @return array
 */
function success($data = null, $msg = '操作成功') {
    $data = $data ?: new \stdClass();
    return resData(1, $msg, $data);
}

/**
 * 错误返回数据
 * @param string $msg 提示信息
 * @param int|string $code 状态码
 * @return array
 */
function error($msg = '操作失败', $code = 0) {
    return resData($code, $msg, new \stdClass());
}

/**
 * 盐值md5
 * @param string $str
 * @return string
 */
function saltMd5($str) {
    return md5("f7R8r7n{$str}CaMw3ON2yq");
}


/**
 * 格式化 分页数据
 * @param \Hyperf\Contract\LengthAwarePaginatorInterface $obj
 * @return array
 */
function paginate($obj) {
    $data = [
        'total' => $obj->total(),
        'per_page' => $obj->perPage(),
        'current_page' => $obj->currentPage(),
        'page_total' => 0,
        'lists' => $obj->items(),
    ];
    $data['page_total'] = ceil($data['total'] / $data['per_page']);
    return $data;
}

/**
 * 手机号码遮蔽
 * @param $phone string 手机号码
 * @return mixed|string
 */
function phoneShading($phone) {
    return substr_replace($phone, '****', 3, 4);
}

/**
 * 手机号码验证
 * @param $phone string 手机号码
 * @return false|int
 */
function phoneCheck($phone) {
    return (bool) preg_match('/^1[3456789]\d{9}$/', $phone);
}

/**
 * 密码校验
 * @param $value
 * @return bool
 */
function pwdCheck($value) {
    if (!preg_match('/^[a-zA-Z0-9]{6,20}$/', $value)) {
        return false;
    }
    if (preg_match('/^[a-zA-Z]+$/', $value)) {
        return false;
    }
    if (preg_match('/^[0-9]+$/', $value)) {
        return false;
    }
    return true;
}

/**
 * 小时：分钟 时间格式验证
 * @param $time
 * @return false|int
 */
function timeCheck($time) {
    return preg_match('/^([01]\d|2[0123]):([0-5]\d|59)$/', $time);
}

/**
 * 分页记录数校验
 * @param $size
 * @return mixed
 */
function pageSizeVerify($size) {
    $page = [10, 20, 30, 40];
    if (in_array($size, $page)) {
        return (int) $size;
    }
    return $page[0];
}

/**
 * oss地址前缀
 * @param string $url
 * @return string
 */
function oss($url) {
    $path = '';
    return $url ? $path . $url : '';
}

/**
 * 清除oss地址前缀
 * @param string $url
 * @return string
 */
function ossClear($url) {
    $path = config('md.oss');
    return str_replace($path, '', $url);
}

/**
 * oss地址前缀（多图使用）
 * @param $urls
 * @return array
 */
function ossArray($urls) {
    if (empty($urls)) {
        return [];
    } else {
        $urls = explode(',', $urls);
    }
    $path = config('md.oss');
    foreach ($urls as &$url) {
        $url = $path . $url;
    }
    return $urls;
}

/**
 * json格式化
 * @param $str
 * @return false|string
 */
function md_json($str) {
    return json_encode($str, JSON_UNESCAPED_UNICODE);
}

/**
 * 座机匹配
 * 格式 0316-8418331
 * @param $str
 * @return bool
 */
function tellCheck($str) {
    return (bool) preg_match('/^0\d{2,3}-\d{7,8}$/', $str);
}

/**
 * 金额匹配
 * @param $money
 * @return bool
 */
function moneyCheck($money) {
    return (bool) preg_match('/^([1-9]\d{0,5}|0)(\.\d{0,2})?$/', $money);
}

/**
 * 过滤Emoji表情
 * @param $str
 * @return string|string[]|null
 */
function filterEmoji($str) {
    return preg_replace('/[^\x{4e00}-\x{9fa5}\w.`~!@#$%^&*()+\-=\[\]{}\\\|;:\'"<>,\/?·！￥…（）；‘’“”：《》，。？、—【】]/u', '', $str);
}

/**
 * uuid
 * @return string
 */
function uuid() {
    return sprintf('%04x%04x%04x%04x%04x%04x%04x%04x',

        // 32 bits for "time_low"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),

        // 16 bits for "time_mid"
        mt_rand(0, 0xffff),

        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand(0, 0x0fff) | 0x4000,

        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand(0, 0x3fff) | 0x8000,

        // 48 bits for "node"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}
